/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import controller.Compra;
import controller.Conexao;
import controller.ContaPagar;
import controller.Estoque;
import controller.Produto;
import javax.swing.JOptionPane;

/**
 *
 * @author Alcivando
 */
public class CompraDAO {

    Compra compra = new Compra();
    private Connection connection;

    public CompraDAO() throws SQLException {
        this.connection = Conexao.getConnection();

    }

    /**
     * Este método adiciona no BD os dados de uma compra.
     */

    public void adiciona(Compra compra, ArrayList<Produto> listaProdutos) throws SQLException, Exception {

        //adiciona o codigo ao proximo cliente a ser inserido
        compra.setCodCompra(retornaProximoID());

        // insere os dados do cliente com a conexao para o banco de dados.
        String sql = "insert into compras values (?,?,?,?,?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setInt(1, compra.getCodCompra());
        stmt.setString(2, compra.getData());
        stmt.setDouble(3, compra.getTotal());
        stmt.setString(4, compra.getTipoPagamento());
        stmt.setInt(5, compra.getnParcelas());
        stmt.setDouble(6, compra.getValorParcela());
        stmt.setString(7, compra.getVencimentoParcela());


        // busca os campos preenchidos na classe de Clientes.

        stmt.execute();


        for (Produto p : listaProdutos) {
            sql = "insert into \"itensCompra\" values (?,?,?)";
            stmt = connection.prepareStatement(sql);

            stmt.setInt(1, compra.getCodCompra());
            stmt.setInt(2, p.getCodProduto());
            stmt.setInt(3, p.getQuantidade());

            if (compra.getTipoPagamento() == "Á prazo") {

                FornecedorDAO fdao = new FornecedorDAO();

                fdao.adicionarValorConta(p.getCodFornecedor(), p.getPreco() * p.getQuantidade());

                ContaPagarDAO cdao = new ContaPagarDAO();

                ContaPagar conta = new ContaPagar();

                conta.setCodFornecedor(p.getCodFornecedor());
                conta.setValorParcela(p.getPreco() * p.getQuantidade()/compra.getnParcelas());
                conta.setVencimento(compra.getVencimentoParcela());
                conta.setnParcela(compra.getnParcelas());

                cdao.adiciona(conta);

            }

            EstoqueDAO edao = new EstoqueDAO();
            Estoque e = new Estoque();

            e.setCodProduto(p.getCodProduto());
            e.setDataEntrada(compra.getData());
            e.setQuantidade(p.getQuantidade());

            edao.adicionaQtdProduto(e);

        }

        stmt.execute();
        stmt.close();


        JOptionPane.showMessageDialog(null, "Compra realizada com sucesso!", "Concluído", 1);

    }

    /**
     * Este método retorna o proximo código da conta que é pegado no BD.
     */

    public int retornaProximoCodConta() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codConta\") from \"contaPagar\";";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }

    /**
     * Este método retorna a lista de Compras Cadastradas no Banco de Dados.
     */

    public ArrayList<Compra> RetornaTodasCompras() {
        PreparedStatement comando;
        ArrayList<Compra> listaCliente = new ArrayList<Compra>();

        try {

            String sql = "SELECT * FROM compras";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                Compra compra = new Compra();

                compra.setCodCompra(rs.getInt("codCompra"));
                compra.setCodFuncionario(rs.getInt("codFuncionario"));

                listaCliente.add(compra);

            }
            comando.close();

            return listaCliente;

        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * Este método deleta do BD a compra informado.
     */

    public void remover(Compra compra) throws SQLException {
        PreparedStatement comando;
        try {
            String sql = "DELETE FROM compras WHERE codCompra=?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, compra.getCodCompra());
            comando.execute();
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }



    public ArrayList<Compra> retornaCompraPorProduto(int codProduto) {
        PreparedStatement comando;
        ArrayList<Compra> listaCliente = new ArrayList<Compra>();

        try {
            String sql = "SELECT * FROM compras WHERE \"codProduto\" LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, codProduto + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Compra compra = new Compra();

                compra.setCodCompra(rs.getInt("codCodCompra"));
                compra.setCodFuncionario(rs.getInt("nomeFuncionario"));
                compra.setData(rs.getString("data"));
                compra.setTotal(rs.getDouble("total"));


            }

            comando.close();
            return listaCliente;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Produto> retornaProdutosCompras(int codCompra) {
        PreparedStatement comando;
        ArrayList<Produto> listaProduto = new ArrayList<Produto>();

        try {
            String sql = "SELECT \"itensCompra\".* FROM compras, \"itensCompra\" WHERE compras.\"codCompra\" = \"itensCompra\".\"idCompra\" and compras.\"codCompra\" = ?;";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codCompra);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                ProdutoDAO pdao = new ProdutoDAO();

                Produto p = pdao.retornaProdutoPorCodigo(rs.getInt("codProduto"));

                listaProduto.add(p);
            }

            comando.close();
            return listaProduto;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public Compra retornaCompraPorCodigo(int cod) {
        PreparedStatement comando;

        try {
            String sql = "SELECT * FROM compras WHERE \"codCompra\" =?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, cod);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Compra compra = new Compra();

                compra.setCodCompra(rs.getInt("CodCompra"));
                compra.setCodFuncionario(rs.getInt("codFuncionario"));
                compra.setData(rs.getString("data"));
                compra.setTotal(rs.getDouble("total"));

            }

            comando.close();
            return compra;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public Double retornaTotal(Compra compra) {
        PreparedStatement comando;

        try {
            String sql = "SELECT sum(produto.preco) FROM produto, \"itensCompra\" WHERE \"itensCompra\".\"idProduto\" = produto.\"codProduto\" and \"itensCompra\".\"idCompra\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, compra.getCodCompra());
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            Double valor = rs.getDouble("sum");

            comando.close();
            return valor;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public int retornaProximoID() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codCompra\") from compras;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }
    
}
